﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace CoreInmobiliario.Frontend
{
    public partial class Propiedad : System.Web.UI.Page
    {
        public static List<ListItem> listFotosToRemove = new List<ListItem>();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                if (Session[HelperClasses.Parameters.USERID] != null)
                {
                    LoadCombos();
                    LoadCheckList();
                    CleanDirectoryTemp();

                    if (Request.QueryString["id"] != null)
                        LoadPropiedad();
                    else
                        PreLoadProvLoc();
                }
                else
                    Response.Redirect("Error.aspx");
            }
        }

        public void PreLoadProvLoc()
        {
            cmbProvincia.SelectedIndex = cmbProvincia.Items.IndexOf(cmbProvincia.Items.FindByText("BUENOS AIRES"));

            cmbLocalidad.DataSource = Business.Localidad.GetInstance().GetListLocalidadByProvinciaId(Int32.Parse(cmbProvincia.SelectedValue));
            cmbLocalidad.DataBind();
            cmbLocalidad.Items.Insert(0, new ListItem("Seleccione una localidad", "0"));

            cmbLocalidad.SelectedIndex = cmbLocalidad.Items.IndexOf(cmbLocalidad.Items.FindByText("LA PLATA"));
        }

        public void LoadPropiedad()
        {
            try
            {
                int propiedadId = Int32.Parse(Request.QueryString["id"].ToString());
                Data.Propiedad prop = Business.Propiedad.GetInstance().GetById(propiedadId);

                if (prop != null)
                {
                    hiddenPropiedadId.Value = prop.PropiedadId.ToString();

                    txtCalle.Text = prop.Calle;
                    txtInterseccion.Text = prop.Interseccion;
                    txtDescripcion.Text = prop.Descripcion;
                    if (prop.Piso != null)
                        txtPiso.Text = prop.Piso.ToString();
                    txtNumero.Text = prop.Numero;
                    txtDepto.Text = prop.Depto;
                    if (prop.Superficie != null)
                        txtSuperficie.Text = prop.Superficie.ToString();
                    if (prop.MetrosCubiertos != null)
                        txtMetrosCubiertos.Text = prop.MetrosCubiertos.ToString();
                    cmbDisposicion.SelectedIndex = cmbDisposicion.Items.IndexOf(cmbDisposicion.Items.FindByValue(prop.DisposicionId.ToString()));
                    if (prop.Dormitorios != null)
                        txtDormitorios.Text = prop.Dormitorios.ToString();
                    if (prop.Ambientes != null)
                        txtAmbientes.Text = prop.Ambientes.ToString();
                    if (prop.Banio != null)
                        txtBaños.Text = prop.Banio.ToString();
                    if (prop.Antiguedad != null)
                        txtAntiguedad.Text = prop.Antiguedad.ToString();

                    cmbTipo.SelectedIndex = cmbTipo.Items.IndexOf(cmbTipo.Items.FindByValue(prop.TipoPropiedadId.ToString()));
                    cmbEstado.SelectedIndex = cmbEstado.Items.IndexOf(cmbEstado.Items.FindByText(prop.Estado));
                    cmbProvincia.SelectedIndex = cmbProvincia.Items.IndexOf(cmbProvincia.Items.FindByValue(prop.Localidad.Departamento.ProvinciaId.ToString()));

                    cmbLocalidad.DataSource = Business.Localidad.GetInstance().GetListLocalidadByProvinciaId(Int32.Parse(cmbProvincia.SelectedValue));
                    cmbLocalidad.DataBind();
                    cmbLocalidad.Items.Insert(0, new ListItem("Seleccione una localidad", "0"));
                    cmbLocalidad.SelectedIndex = cmbLocalidad.Items.IndexOf(cmbLocalidad.Items.FindByValue(prop.Localidad.LocalidadId.ToString()));

                    List<Data.PropiedadServicio> listServicios = Business.Propiedad.GetInstance().GetServiciosByPropiedadId(propiedadId);
                    foreach (ListItem i in boxsServicios.Items)
                    {
                        if (listServicios.Exists(s => s.ServicioId.Equals(Int32.Parse(i.Value))))
                            i.Selected = true;
                    }

                    List<Data.PropiedadCaracteristica> listCaracteristicas = Business.Propiedad.GetInstance().GetCaracteristicasByPropiedadId(propiedadId);
                    foreach (ListItem i in boxsCaracteriscicas.Items)
                    {
                        if (listCaracteristicas.Exists(c => c.CaracteristicaId.Equals(Int32.Parse(i.Value))))
                            i.Selected = true;
                    }

                    LoadFotos(HelperClasses.Utils.GetConfig(HelperClasses.Parameters.PROPIEDADES_PATH) + prop.PropiedadId.ToString() + "/", prop.PropiedadId);
                }
                else
                    Response.Redirect("Propiedades.aspx");
            }
            catch(Exception ex)
            {
                Response.Redirect("Propiedades.aspx");
            }
        }

        public void LoadFotos(string path, int propiedadId)
        {
            List<HelperClasses.DTO.FotoVideo> listFotos = new List<HelperClasses.DTO.FotoVideo>();
            DirectoryInfo directorio = new System.IO.DirectoryInfo(Server.MapPath(path));
            FileInfo[] files = directorio.GetFiles();

            foreach (FileInfo file in files)
                listFotos.Add(new HelperClasses.DTO.FotoVideo() { Nombre = "<img src='Images/Propiedades/" + propiedadId.ToString() + "/" + file.Name + "' style='width:150px; height:135px;' class='imgBuscador' />", Id = file.Name });
            
            boxFotos.DataSource = listFotos;
            boxFotos.DataBind();
        }

        public void CleanDirectoryTemp()
        {
            string fileTempPath = HelperClasses.Utils.GetConfig(HelperClasses.Parameters.PROPIEDADES_PATH) + "Temp/";
            DirectoryInfo directorioTemp = new System.IO.DirectoryInfo(Server.MapPath(fileTempPath));

            FileInfo[] files = directorioTemp.GetFiles();
            foreach (FileInfo file in files)
                file.Delete();
        }

        public void LoadCombos()
        {
            cmbDisposicion.DataSource = Business.Disposicion.GetInstance().GetList();
            cmbDisposicion.DataBind();
            cmbDisposicion.Items.Insert(0, new ListItem("Seleccione una disposición", "0"));
            cmbTipo.DataSource = Business.TipoPropiedad.GetInstance().GetList();
            cmbTipo.DataBind();
            cmbTipo.Items.Insert(0, new ListItem("Seleccione un tipo", "0"));
            cmbProvincia.DataSource = Business.Provincia.GetInstance().GetList();
            cmbProvincia.DataBind();
            cmbProvincia.Items.Insert(0, new ListItem("Seleccione una provincia", "0"));
        }

        public void LoadCheckList()
        {
            boxsCaracteriscicas.DataSource = Business.Caracteristica.GetInstance().GetList();
            boxsCaracteriscicas.DataBind();

            boxsServicios.DataSource = Business.Servicio.GetInstance().GetList();
            boxsServicios.DataBind();
        }

        protected void cmbProvincia_SelectedIndexChanged(object sender, EventArgs e)
        {
            cmbLocalidad.DataSource = Business.Localidad.GetInstance().GetListLocalidadByProvinciaId(Int32.Parse(cmbProvincia.SelectedValue));
            cmbLocalidad.DataBind();
            cmbLocalidad.Items.Insert(0, new ListItem("Seleccione una localidad", "0"));
        }

        protected void btnVolver_Click(object sender, EventArgs e)
        {
            Response.Redirect("Propiedades.aspx");
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            int propiedadId = 0;

            //Se asignan los valores pertinentes a la propiedad
            Data.Propiedad prop = new Data.Propiedad();
            prop.Calle = txtCalle.Text;
            prop.Descripcion = txtDescripcion.Text;
            prop.Interseccion = txtInterseccion.Text;
            if (txtPiso.Text != "")
                prop.Piso = Int32.Parse(txtPiso.Text);
            prop.Numero = txtNumero.Text;
            prop.Depto = txtDepto.Text;
            if (txtSuperficie.Text != "")
                prop.Superficie = Int32.Parse(txtSuperficie.Text);
            if (txtMetrosCubiertos.Text != "")
                prop.MetrosCubiertos = Int32.Parse(txtMetrosCubiertos.Text);
            if (cmbDisposicion.SelectedIndex != 0)
                prop.DisposicionId = Int32.Parse(cmbDisposicion.SelectedValue);
            else
                prop.DisposicionId = null;
            if (txtDormitorios.Text != "")
                prop.Dormitorios = Int32.Parse(txtDormitorios.Text);
            if (txtAmbientes.Text != "")
                prop.Ambientes = Int32.Parse(txtAmbientes.Text);
            if (txtBaños.Text != "")
                prop.Banio = Int32.Parse(txtBaños.Text);
            if (txtAntiguedad.Text != "")
                prop.Antiguedad = txtAntiguedad.Text + " años";
            prop.LocalidadId = Int32.Parse(cmbLocalidad.SelectedValue);
            prop.TipoPropiedadId = Int32.Parse(cmbTipo.SelectedValue);
            prop.Estado = cmbEstado.SelectedItem.Text;

            //Tenemos una propiedad en edición.La variable propiedadId se llena con el QueryString
            if (hiddenPropiedadId.Value != "")
            {
                prop.PropiedadId = Int32.Parse(hiddenPropiedadId.Value);
                Business.Propiedad.GetInstance().UpdatePropiedad(prop);
                propiedadId = Int32.Parse(hiddenPropiedadId.Value);
            }
            else //Propiedad a crear. La variable propiedadId se llena con el ultimo ID insertado en la BBDD
            {
                Business.Propiedad.GetInstance().InsertPropiedad(prop);
                propiedadId = Business.Propiedad.GetInstance().GetLastPropiedadId();
            }

            foreach(ListItem i in boxsCaracteriscicas.Items)
            {
                Data.PropiedadCaracteristica pc = Business.Propiedad.GetInstance().GetByPropiedadIdCaracteristicaId(propiedadId, Int32.Parse(i.Value));

                if (i.Selected)
                {
                    if (pc == null)
                        Business.Propiedad.GetInstance().InsertPropiedadCaracteristica(new Data.PropiedadCaracteristica() { CaracteristicaId = Int32.Parse(i.Value), PropiedadId = propiedadId });
                }
                else
                {
                    if (pc != null)
                        Business.Propiedad.GetInstance().DeletePropiedadCaracteristica(pc);
                }
            }

            foreach (ListItem i in boxsServicios.Items)
            {
                Data.PropiedadServicio ps = Business.Propiedad.GetInstance().GetByPropiedadIdServicioId(propiedadId, Int32.Parse(i.Value));
                if (i.Selected)
                {
                    if (ps == null)
                        Business.Propiedad.GetInstance().InsertPropiedadServicios(new Data.PropiedadServicio() { ServicioId = Int32.Parse(i.Value), PropiedadId = propiedadId });
                }
                else
                {
                    if (ps != null)
                        Business.Propiedad.GetInstance().DeletePropiedadServicios(ps);
                }
            }

            string fileTempPath = HelperClasses.Utils.GetConfig(HelperClasses.Parameters.PROPIEDADES_PATH) + "Temp/";
            string filePath = HelperClasses.Utils.GetConfig(HelperClasses.Parameters.PROPIEDADES_PATH) + propiedadId.ToString();

            //Elimina fotos seleccionadas
            if (listFotosToRemove.Count != 0)
            {
                DirectoryInfo directorio = new System.IO.DirectoryInfo(Server.MapPath(filePath));

                FileInfo[] filesToDelete = directorio.GetFiles();
                foreach (FileInfo file in filesToDelete)
                {
                    if (listFotosToRemove.FirstOrDefault(f => f.Value.Equals(file.Name)) != null)
                        file.Delete();
                }
            }

            //Nuevas Fotos
            DirectoryInfo directorioTemp = new System.IO.DirectoryInfo(Server.MapPath(fileTempPath));
            Directory.CreateDirectory(Server.MapPath(filePath));

            FileInfo[] files = directorioTemp.GetFiles();
            foreach (FileInfo file in files)
            {
                string[] filesInFolder = Directory.GetFiles(Server.MapPath(HelperClasses.Utils.GetConfig(HelperClasses.Parameters.PROPIEDADES_PATH) + propiedadId.ToString() + "/"));
                string newFileName = GetNameForNewFile(propiedadId);
                file.CopyTo(Server.MapPath(filePath + "/" + newFileName + file.Extension));
                file.Delete();
            }

            if (hiddenPropiedadId.Value == "")
            {
                btnGuardar.Visible = false;
                popupMensaje.SetTitulo("Nueva Propiedad");
                popupMensaje.SetMessage("La nueva propiedad fue cargada con éxito.");
            }
            else
            {
                popupMensaje.SetTitulo("Editar Propiedad");
                popupMensaje.SetMessage("La nueva propiedad fue modificada con éxito.");
            }
            popupMensaje.SetIcon(HelperClasses.Parameters.OK_ICON);
            mpeMensaje.Show();
        }

        protected void btnEliminarFotos_Click(object sender, EventArgs e)
        {
            foreach (ListItem i in boxFotos.Items)
            {
                if (i.Selected)
                    listFotosToRemove.Add(i);
            }

            foreach (ListItem i in listFotosToRemove)
                boxFotos.Items.Remove(i);
        }

        public string GetNameForNewFile(int propiedadId)
        {
            string newFileName = "";
            string filePath = HelperClasses.Utils.GetConfig(HelperClasses.Parameters.PROPIEDADES_PATH) + propiedadId.ToString();
            DirectoryInfo directorio = new System.IO.DirectoryInfo(Server.MapPath(filePath));

            FileInfo[] files = directorio.GetFiles();
            int indexFile = files.Length + 1;
            for (int i = 0; i < 9999; i++)
            {
                if (files.FirstOrDefault(f => f.Name.Equals(indexFile.ToString() + ".jpg")) == null)
                {
                    if (files.FirstOrDefault(f => f.Name.Equals(indexFile.ToString() + ".jpeg")) == null)
                    {
                        if (files.FirstOrDefault(f => f.Name.Equals(indexFile.ToString() + ".png")) == null)
                        {
                            newFileName = indexFile.ToString();
                            break;
                        }
                    }
                }

                indexFile++;
            }

            return newFileName;
        }
    }
}